//
// Created by fairy on 2025/7/1.
//
#pragma once
#include <core_common.hpp>
#include <delay.hpp>
#include <hal.hpp>
#include <registers.hpp>
namespace core
{
    using test_pin = hal::gpio::portA::pin8;

}

namespace core
{
    class control
    {
        volatile static inline uint16_t adc_value = 0;
    public:
        ALWAYS_INLINE static void init();
        inline static void handler();
        ALWAYS_INLINE static auto set_adc_value(auto value){adc_value = value;}
    };
}// namespace core
using gain_pin1 = hal::gpio::portA::pin11;
using gain_pin2 = hal::gpio::portA::pin12;
constexpr uint16_t buffer_size= 400;
static volatile float adc1_ch0_data[buffer_size]={};
static volatile float adc1_ch1_data[buffer_size]={};
static uint32_t ADC1_DATA[100] = {0};
// 初始化函数
void core::control::init()
{

    test_pin cfg;
    cfg.initializer().speed.low().pull.up().mode.output();
    cfg.initializer().speed.high().pull.up().mode.output();
    using sck_pin = hal::gpio::pinOld<GPIOA_BASE,8>;

    using namespace hal::gpio;
    sck_pin::init<mode::output_pp,pull::none,speed::very_high,GPIO_AF5_SPI1>();
    using dac= hal::detail_dac::dac_config;
    dac::init();
    dac::set_voltage(500);

    gain_pin1 cfg1;
    gain_pin2 cfg2;
    cfg1.initializer().mode.output().pull.none().speed.very_high();
    cfg2.initializer().mode.output().pull.none().speed.very_high();
    gain_pin1::clear();
    gain_pin2::clear();
    // adc::init_IT(FREQ_84M_to_1K);// 初始化ADC1
    // adc::start_IT();
    // hal::adc_temperature::init();
    // hal::adc_temperature::init();


    hal::adc1::init();
    // hal::adc2::init();
    hal::adc_temperature::init();
    hal::adc1::start(ADC1_DATA, std::size(ADC1_DATA));
    // hal::adc2::start(adc2_data, std::size(adc2_data));
}

namespace FPGA
{

    // ---------- 信息处理模块 ----------
    // 需要的信息：最大值（12位）、最小值（12位）、上升沿时间（16位）、高低电平周期（21位*2）
    // 幅值、高低电平和上升沿时间，共5个，那么就是3位    17和16 3 → 6
    // 0x60060000：最大值
    // 0x60060001：最小值
    // 0x60060002：高电平周期低位
    // 0x60060003：高电平周期高位
    // 0x60060004：低电平周期低位
    // 0x60060005：低电平周期高位
    // 0x60060006：上升沿时间

    // inline uint16_t x= FPGA_INFO_REG->full;

    using FPGA_RESET_PIN = hal::gpio::portC::pin5;

    inline void FPGA_RESET()
    {
        // 第一阶段：复位信号激活（低电平有效时省略此步）
        FPGA_RESET_PIN::set();
        HAL_Delay(10);  // 保证稳定

        // 正式复位脉冲
        FPGA_RESET_PIN::clear();
        HAL_Delay(50);  // 维持复位状态时间（典型值20-100ms）

        // 结束复位
        FPGA_RESET_PIN::set();
    }

}
struct pulse_param {
    uint16_t max_value;      // 最大值
    uint16_t min_value;      // 最小值
    uint32_t high_period;    // 高电平周期
    uint32_t low_period;     // 低电平周期
    uint16_t rise_time;      // 上升沿时间
    uint16_t pulse_cycles;      // 验证
    uint16_t valid;
};
struct pulse_param_real {
    float  max_value_real;      // 最大值
    float min_value_real;      // 最小值
    float freq;                //频率
    float duty_circle;         //占空比
    float rise_time_real;      // 上升沿时间
};
#define FPGA_PULSE_INFO_REG ((volatile pulse_param *) 0x60000000)
// 运行函数
inline volatile pulse_param param{};
inline volatile pulse_param_real param_real{};
inline volatile uint16_t valid{};
constexpr float ampl[4]={1,5,10,50};
inline volatile static uint16_t amplify_real = 1;
void core::control::handler()
{
    // using namespace gui::interface;
    // PPM::generate_text(fo, D, Vm, tr);
    using dac = hal::detail_dac::dac_config;
    // constexpr float opa_control_voltage=3300.0f;
    // dac::set_voltage(opa_control_voltage);

    param.max_value=FPGA_PULSE_INFO_REG->max_value;// x/4095*2.0f
    param.min_value=FPGA_PULSE_INFO_REG->min_value;
    param.high_period=FPGA_PULSE_INFO_REG->high_period;// x/pulse_cycles*(1.0f/20M)
    param.low_period=FPGA_PULSE_INFO_REG->low_period;
    param.rise_time=FPGA_PULSE_INFO_REG->rise_time;// x*(1.0f/20M)
    param.pulse_cycles= FPGA_PULSE_INFO_REG->pulse_cycles;
    param.valid  = FPGA_PULSE_INFO_REG->valid;

    param_real.max_value_real=(2.0f* static_cast<float>(param.max_value))/4095.0f*1000;
    param_real.min_value_real=(2.0f*static_cast<float>(param.min_value))/4095.0f*1000;
    param_real.freq=1.0f/(static_cast<float>(param.high_period+param.low_period)/static_cast<float>(param.pulse_cycles)*1.0f/25000000.0f);
    param_real.duty_circle= (100*static_cast<float>(param.high_period)/static_cast<float>(param.pulse_cycles)*1.0f/25000000.0f)/ (1.0f/param_real.freq);
    param_real.rise_time_real= static_cast<float>(param.rise_time)*(1.0f/25000000.0f)*1000000.0f;

    using PPM=gui::interface::PPM;
    PPM::generate_text(param_real.freq,param_real.duty_circle,param_real.max_value_real-param_real.min_value_real,param_real.rise_time_real);
    //00 vpp:1120mv->720mv      1倍
    //01 vpp:1120mv->720mv      5倍
    //10 vpp:1120mv->720mv      10倍
    //11 vpp:1120mv->720mv      50倍

    // gain_pin1::clear();
    // gain_pin2::clear();

    gain_pin1::set();

    // if (param_real.max_value_real > 100)
    // {
    //     乘上1.6
    //     gain_pin1::clear();
    //     gain_pin2::clear();
    //     amplify_real=1;
    //
    // }
    // else if (param_real.max_value_real>=50&param_real.max_value_real<=100)
    // {
    //     gain_pin1::set();
    //     gain_pin2::clear();
    //     amplify_real=5;
    // }
    // else if (param_real.max_value_real>=25&param_real.max_value_real<=50)
    // {
    //     gain_pin1::clear();
    //     gain_pin2::set();
    //     amplify_real=10;
    // }
    // else if (param_real.max_value_real>=0&param_real.max_value_real<=25)
    // {
    //     gain_pin1::set();
    //     gain_pin2::set();
    //     amplify_real=50;
    // }



    delay::ms(100);
    // 设置中间值测试
    // HAL_DAC_SetValue(dac::getDACHandle(), DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
    // // 延时确保输出稳定
    // HAL_Delay(10);

    // static uint16_t temp{};
    // temp = adc_value;
    // static volatile float temperature{};
    // temperature = hal::adc_temperature::read();
    // delay::ms(100);
    // // test_pin::toggle();


}





